package swimv2.ejb.entity;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;

import swimv2.ejb.entity.*;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.persistence.Column;

import org.hibernate.annotations.Sort;
import org.hibernate.annotations.SortType;


@Entity
@Inheritance(strategy=InheritanceType.JOINED)
@Table(name = "Utente")
public class Utente implements Serializable,Comparable<Utente>{

	private static final long serialVersionUID = 1L;
	
	private String username;
	private String password;
	private String nome;
	private String cognome;
	private byte[] foto;
	
	private SortedSet<Lavoro> lavoriOfferti = new TreeSet<Lavoro>();
	
	private List<Notifica> notifiche = new ArrayList<Notifica>();
	
	private SortedSet<Capacita> capacita = new TreeSet<Capacita>();

	private List<CapacitaRichiesta> capacitaRichieste= new ArrayList<CapacitaRichiesta>();

	//la relazione inversa non si aggiorna automaticamente
	private SortedSet<Utente> amici = new TreeSet<Utente>(); 
	
	private SortedSet<Utente> richiesteAmiciziaEffettuate= new TreeSet<Utente>();
	
	private SortedSet<Utente> richiesteAmiciziaRicevute= new TreeSet<Utente>();
	
	private Set<Lavoro> candidature = new TreeSet<Lavoro>();

	public Utente(String nome,String cognome,String username,String password)
	{
		super();
		setNome(nome);
		setPassword(password);
		setUsername(username);
		setCognome(cognome);
		
	}
	public Utente()
	{
		super();
		setNome("");
		
	}

	@Column(name="nome")
	public String getNome() {
		return nome;
	}



	public void setNome(String nome) {
		this.nome = nome;
	}
	
	@Id
	  @Column(name="username")
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	
	  @Column(name="password")
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	
	  @Column(name="cognome")
	public String getCognome() {
		return cognome;
	}
	public void setCognome(String cognome) {
		this.cognome = cognome;
	}
	
	@Column(name="foto")
	public byte[] getFoto() {
		return foto;
	}
	public void setFoto(byte[] foto) {
		this.foto = foto;
	}
	
	@OneToMany(mappedBy="datore")
	@Sort(type = SortType.NATURAL)

	public SortedSet<Lavoro> getLavoriOfferti() {
		return lavoriOfferti;
	}
	public void setLavoriOfferti(SortedSet<Lavoro> lavoriOfferti) {
		this.lavoriOfferti = lavoriOfferti;
	}

	@OneToMany(fetch=FetchType.EAGER)
	public List<Notifica> getNotifiche() {
		return notifiche;
	}
	public void setNotifiche(List<Notifica> notifiche) {
		this.notifiche = notifiche;
	}
	@Override
	public int compareTo(Utente nemico) {
		return this.username.compareTo(nemico.username);
		
	}
	
	@ManyToMany
	@JoinTable(name="capacitaUtenti",
	joinColumns={@JoinColumn(name="utente")},
	inverseJoinColumns={@JoinColumn(name="capacita")} )	
	@Sort(type = SortType.NATURAL)
	public SortedSet<Capacita> getCapacita() {
		return capacita;
	}
	
	public void setCapacita(SortedSet<Capacita> capacita) {
		this.capacita = capacita;
	}
	
	@ManyToMany 
	@JoinTable(name="Amicizia",
		joinColumns={@JoinColumn(name="utente1")},
		inverseJoinColumns={@JoinColumn(name="utente2")} )
	@Sort(type = SortType.NATURAL)
	public SortedSet<Utente> getAmici() {
		return amici;
	}
	public void setAmici(SortedSet<Utente> amici) {
		this.amici = amici;
	}
	@ManyToMany 
	@JoinTable(name="richiesteAmicizia",
		joinColumns={@JoinColumn(name="utente1")},
		inverseJoinColumns={@JoinColumn(name="utente2")} )
	@Sort(type = SortType.NATURAL)

	public SortedSet<Utente> getRichiesteAmiciziaEffettuate() {
		return richiesteAmiciziaEffettuate;
	}
	public void setRichiesteAmiciziaEffettuate(
			SortedSet<Utente> richiesteAmiciziaEffettuate) {
		this.richiesteAmiciziaEffettuate = richiesteAmiciziaEffettuate;
	}
	@ManyToMany 
	@JoinTable(name="richiesteAmicizia",
		joinColumns={@JoinColumn(name="utente2")},
		inverseJoinColumns={@JoinColumn(name="utente1")} )
	@Sort(type = SortType.NATURAL)
	public SortedSet<Utente> getRichiesteAmiciziaRicevute() {
		return richiesteAmiciziaRicevute;
	}
	public void setRichiesteAmiciziaRicevute(
			SortedSet<Utente> richiesteAmiciziaRicevute) {
		this.richiesteAmiciziaRicevute = richiesteAmiciziaRicevute;
	}
	
	
	@OneToMany(mappedBy="richiedente")
	public List<CapacitaRichiesta> getCapacitaRichieste() {
		return capacitaRichieste;
	}
	public void setCapacitaRichieste(List<CapacitaRichiesta> capacitaRichieste) {
		this.capacitaRichieste = capacitaRichieste;
	}
	
	
	@ManyToMany(mappedBy="candidati",cascade = CascadeType.ALL)
	public Set<Lavoro> getCandidature() {
		return candidature;
	}
	public void setCandidature(Set<Lavoro> candidature) {
		this.candidature = candidature;
	}
	
	public void aggiungiNotifica(Notifica notifica)
	{
		notifiche.add(notifica);
	}
	
	



}
